package com.wdb.modules.mnt.util;

/**
 * @author: wendaobai@qq.com
 * @date: 2024/9/4 星期三 10:56
 */
/** 数据类型枚举类，用于定义和识别不同数据库系统的相关特性 */
public enum DataTypeEnum {
  // MySQL数据库的相关配置
  MYSQL("mysql", "mysql", "com.mysql.jdbc.Driver", "`", "`", "'", "'"),
  // Oracle数据库的相关配置
  ORACLE("oracle", "oracle", "oracle.jdbc.driver.OracleDriver", "\"", "\"", "\"", "\""),
  ;

  // 数据库特性标识
  private String feature;
  // 描述信息
  private String desc;
  // 数据库驱动类名
  private String driver;
  // 关键字前缀
  private String keywordPrefix;
  // 关键字后缀
  private String keywordSuffix;
  // 别名前缀
  private String aliasPrefix;
  // 别名后缀
  private String aliasSuffix;

  // JDBC URL的前缀常量
  private static final String JDBC_URL_PREFIX = "jdbc:";

  /**
   * 枚举构造器，用于初始化数据库类型的相关信息
   *
   * @param feature 数据库特性标识
   * @param desc 描述信息
   * @param driver 数据库驱动类名
   * @param keywordPrefix 关键字前缀
   * @param keywordSuffix 关键字后缀
   * @param aliasPrefix 别名前缀
   * @param aliasSuffix 别名后缀
   */
  DataTypeEnum(
      String feature,
      String desc,
      String driver,
      String keywordPrefix,
      String keywordSuffix,
      String aliasPrefix,
      String aliasSuffix) {
    this.feature = feature;
    this.desc = desc;
    this.driver = driver;
    this.keywordPrefix = keywordPrefix;
    this.keywordSuffix = keywordSuffix;
    this.aliasPrefix = aliasPrefix;
    this.aliasSuffix = aliasSuffix;
  }

  /**
   * 根据JDBC URL识别数据类型枚举
   *
   * @param jdbcUrl JDBC URL字符串
   * @return 对应的DataTypeEnum枚举实例，如果无法识别则返回null
   */
  public static DataTypeEnum urlOf(String jdbcUrl) {
    // 格式化URL字符串
    String url = jdbcUrl.toLowerCase().trim();
    // 遍历所有枚举值
    for (DataTypeEnum dataTypeEnum : values()) {
      // 检查URL是否以特定枚举的特征字符串开头
      if (url.startsWith(JDBC_URL_PREFIX + dataTypeEnum.feature)) {
        try {
          // 尝试加载并实例化驱动类
          Class<?> aClass = Class.forName(dataTypeEnum.getDriver());
          if (null == aClass) {
            throw new RuntimeException("Unable to get driver instance for jdbcUrl: " + jdbcUrl);
          }
        } catch (ClassNotFoundException e) {
          // 如果驱动类不存在，抛出运行时异常
          throw new RuntimeException("Unable to get driver instance: " + jdbcUrl);
        }
        // 返回匹配的枚举实例
        return dataTypeEnum;
      }
    }
    // 如果没有匹配的枚举值，返回null
    return null;
  }

  // Getter方法，返回数据库特性标识
  public String getFeature() {
    return feature;
  }

  // Getter方法，返回描述信息
  public String getDesc() {
    return desc;
  }

  // Getter方法，返回数据库驱动类名
  public String getDriver() {
    return driver;
  }

  // Getter方法，返回关键字前缀
  public String getKeywordPrefix() {
    return keywordPrefix;
  }

  // Getter方法，返回关键字后缀
  public String getKeywordSuffix() {
    return keywordSuffix;
  }

  // Getter方法，返回别名前缀
  public String getAliasPrefix() {
    return aliasPrefix;
  }

  // Getter方法，返回别名后缀
  public String getAliasSuffix() {
    return aliasSuffix;
  }
}
